﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CapaPresentacion.Commands;
using CapaPresentacion.Vistas;
using Entidades;
using CapaLogica;
using System.Windows.Input;
using System.Windows;
using System.Windows.Data;
using System.Transactions;
using System.Globalization;


namespace CapaPresentacion.Controles
{
    class NuevoCicloLectivoViewModel
    {
        public event ReiniciarCU ReiniciarCU;

        #region Variables
        
        private CicloLectivo cicloLectivo;
        private CicloLectivo cicloLectivoSinModificaciones;
        private RelayCommand saveCommand;
        private RelayCommand newCommand;
        private RelayCommand openCommand;

        #endregion

        #region Propiedades
       

        public ICommand SaveCommand
        {
            get
            {
                return saveCommand;
            }
        }

        public ICommand OpenCommand
        {
            get
            {
                return openCommand;
            }
        }

        public ICommand NewCommand
        {
            get
            {
                return newCommand;
            }
        }

        public CicloLectivo CicloLectivo
        {
            get { return cicloLectivo; }
            set { cicloLectivo = value; }
        }

        #endregion

        #region Métodos


        public NuevoCicloLectivoViewModel()
        {

            this.cicloLectivo = new CicloLectivo();
            this.cicloLectivo.Eliminado = false;
            this.saveCommand = new RelayCommand(GuardarCicloLectivo);
            this.newCommand = new RelayCommand(NuevoCicloLectivo);
            this.openCommand = new RelayCommand(AbrirCicloLectivo);
        }

        public NuevoCicloLectivoViewModel(CicloLectivo entidad)
        {

            this.cicloLectivo = entidad;
            this.cicloLectivoSinModificaciones = (CicloLectivo)entidad.Clone();
            this.saveCommand = new RelayCommand(GuardarCicloLectivo);
            this.newCommand = new RelayCommand(NuevoCicloLectivo);
            this.openCommand = new RelayCommand(AbrirCicloLectivo);
        }

        private void NuevoCicloLectivo(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea crear un nuevo ciclo lectivo?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.NuevoCicloLectivo);
            }
        }

        private void AbrirCicloLectivo(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea editar los datos de un ciclo lectivo existente?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.BuscarCicloLectivo);
            }
        }


        private void GuardarCicloLectivo(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea guardar los datos?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {

                if (Validaciones())
                {
                        try
                        {

                            this.cicloLectivo.NombreCicloLectivo = CultureInfo.InvariantCulture.TextInfo.ToTitleCase(this.cicloLectivo.NombreCicloLectivo);

                            if (cicloLectivo.IdCicloLectivo == Guid.Empty) // Nuevo Ciclo Lectivo
                            {
                                cicloLectivo.IdCicloLectivo = Guid.NewGuid();

                           
                                    new CicloLectivoLogica().Agregar(cicloLectivo);
                               
                                    VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "El ciclo lectivo ha sido guardado correctamente");
                                    nueva.ShowDialog();

                                    this.ReiniciarCU(CasosDeUso.NuevoCicloLectivo);
                            
                            }
                            else // Modificación de Ciclo Lectivo
                            {
                                new CicloLectivoLogica().Modificar(cicloLectivo);

                                VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "El ciclo lectivo ha sido modificado correctamente");
                                nueva.ShowDialog();
                                this.ReiniciarCU(CasosDeUso.NuevoCicloLectivo);

                            }
                        }
                         catch (Exception)
                         {
                             VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "Ha ocurrido un error y el ciclo lectivo no se ha guardado");
                             nueva.ShowDialog();
                         }

                }

            }
        }

             

        private bool Validaciones()
        {
            if (cicloLectivo.NombreCicloLectivo == null || cicloLectivo.NombreCicloLectivo == "")
            {
                if (this.cicloLectivoSinModificaciones != null)
                    this.cicloLectivo.NombreCicloLectivo = this.cicloLectivoSinModificaciones.NombreCicloLectivo;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Nombre del ciclo lectivo' no puede estar vacío");
                nueva.ShowDialog();
                return false;
            }

            if (cicloLectivo.FechaDesde == null)
            {
                if (this.cicloLectivoSinModificaciones != null)
                    this.cicloLectivo.FechaDesde = this.cicloLectivoSinModificaciones.FechaDesde;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Fecha de Inicio' no puede estar vacío");
                nueva.ShowDialog();
                return false;
            }

            if (cicloLectivo.FechaHasta == null)
            {
                if (this.cicloLectivoSinModificaciones != null)
                    this.cicloLectivo.FechaHasta = this.cicloLectivoSinModificaciones.FechaHasta;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Fecha de Fin' no puede estar vacío");
                nueva.ShowDialog();
                return false;
            }

            if (cicloLectivo.FechaHasta.Value.Year != cicloLectivo.FechaDesde.Value.Year)
            {
                if (this.cicloLectivoSinModificaciones != null)
                {
                    this.cicloLectivo.FechaDesde = this.cicloLectivoSinModificaciones.FechaDesde;
                    this.cicloLectivo.FechaHasta = this.cicloLectivoSinModificaciones.FechaHasta;
                }

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "Un ciclo lectivo debe comenzar y terminar en el mismo año");
                nueva.ShowDialog();
                return false;
            }

            if (cicloLectivo.FechaHasta < cicloLectivo.FechaDesde)
            {
                if (this.cicloLectivoSinModificaciones != null)
                {
                    this.cicloLectivo.FechaDesde = this.cicloLectivoSinModificaciones.FechaDesde;
                    this.cicloLectivo.FechaHasta = this.cicloLectivoSinModificaciones.FechaHasta;
                }

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Fecha de Fin' no puede ser menor al campo 'Fecha de Inicio'");
                nueva.ShowDialog();
                return false;
            }

           
            if (new CicloLectivoLogica().ValidarAño(cicloLectivo))
            {
                CicloLectivo temp = new CicloLectivoLogica().ObtenerEntidad(CicloLectivo.FechaDesde.Value.Year);

                if (temp.IdCicloLectivo != CicloLectivo.IdCicloLectivo)
                {
                    if (this.cicloLectivoSinModificaciones != null)
                    {
                        this.cicloLectivo.FechaDesde = this.cicloLectivoSinModificaciones.FechaDesde;
                        this.cicloLectivo.FechaHasta = this.cicloLectivoSinModificaciones.FechaHasta;
                    }


                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "No es posible crear más de un ciclo lectivo para el mismo año");
                    nueva.ShowDialog();
                    return false;
                }
            }

            TimeSpan resta =  cicloLectivo.FechaHasta.Value.Subtract(cicloLectivo.FechaDesde.Value);

            if (resta.Days < 180)
            {

                if (this.cicloLectivoSinModificaciones != null)
                {
                    this.cicloLectivo.FechaDesde = this.cicloLectivoSinModificaciones.FechaDesde;
                    this.cicloLectivo.FechaHasta = this.cicloLectivoSinModificaciones.FechaHasta;
                }

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El ciclo lectivo debe durar al menos seis meses");
                nueva.ShowDialog();
                return false;
            }

            
            return true;
        }

        #endregion
    }
}